package common.model.Entity;

import lombok.Getter;

/**
 * 用户角色枚举。
 * <p>
 * 定义系统中不同用户角色的标识与描述，包括：
 * <ul>
 *   <li>{@link #ADMIN} - 管理员</li>
 *   <li>{@link #TEACHER} - 教师</li>
 *   <li>{@link #STUDENT} - 学生</li>
 * </ul>
 * 每个角色包含一个代码（code）、一个中文描述（description）、以及数据库对应的角色编码（dbCode）。
 * </p>
 */
@Getter
public enum UserRole {

    /**
     * 管理员角色
     */
    ADMIN(0, "管理员", "admin"),

    /**
     * 教师角色
     */
    TEACHER(1, "教师", "teacher"),

    /**
     * 学生角色
     */
    STUDENT(2, "学生", "student");

    /**
     * 角色代码（用于系统内部逻辑）
     */
    private final int code;

    /**
     * 角色描述（中文名）
     */
    private final String description;

    /**
     * 数据库中对应的角色编码（与表字段 {@code t_role.role_code} 对应）
     */
    private final String dbCode;

    /**
     * 枚举构造函数。
     *
     * @param code        角色代码
     * @param description 角色中文描述
     * @param dbCode      数据库角色编码
     */
    UserRole(int code, String description, String dbCode) {
        this.code = code;
        this.description = description;
        this.dbCode = dbCode;
    }

    /**
     * 根据角色代码获取枚举值。
     *
     * @param code 角色代码
     * @return 对应的 {@link UserRole}
     * @throws IllegalArgumentException 如果传入的 code 无效
     */
    public static UserRole fromCode(int code) {
        for (UserRole role : UserRole.values()) {
            if (role.getCode() == code) {
                return role;
            }
        }
        throw new IllegalArgumentException("无效的角色代码: " + code);
    }
}
